﻿using System.Collections.Generic;
using Microsoft.Xna.Framework.Input;

namespace Main.src.input
{

    /// <summary>
    /// Controlador de teclas
    /// </summary>
    public static class Input
    {

        private static          int[] State       = new int[256]; // Container dos
        private static readonly int   KEY_PRESS   = 0x01;         // Estado de pressionamento
        private static readonly int   KEY_TRIGGER = 0x02;         // Estado de clique
        private static readonly int   KEY_RELEASE = 0x04;         // Estado de solto

        /// <summary>
        /// Atualiza o estado das teclas
        /// </summary>
        public static void Update()
        {
            KeyboardState KState = Keyboard.GetState();
            for (int Key = 0; Key < 256; ++Key)
            {
                int v = State[Key];
                if (KState.IsKeyDown((Keys)Key))
                    if ((v & KEY_PRESS) == 0)
                        v = KEY_TRIGGER | KEY_PRESS;
                    else
                        v = KEY_PRESS;
                else if ((v & KEY_PRESS) != 0)
                    v = KEY_RELEASE;
                else
                    v = 0;
                State[Key] = v;
            }
        }

        /// <summary>
        /// Verifica se uma tecla foi clicada
        /// </summary>
        /// <param name="Key">ID da tecla</param>
        /// <returns>Se ela está com o estado de clique</returns>
        public static bool Trigger(Keys Key)
        {
            return (State[(int)Key] & KEY_TRIGGER) != 0;
        }

        /// <summary>
        /// Verifica se uma tecla está pressionada
        /// </summary>
        /// <param name="Key">ID da tecla</param>
        /// <returns>Se ela está com o estado de pressionamentos</returns>
        public static bool Press(Keys Key)
        {
            return (State[(int)Key] & KEY_PRESS) != 0;
        }

        /// <summary>
        /// Verifica se uma tecla foi solta
        /// </summary>
        /// <param name="Key">ID da tecla</param>
        /// <returns>Se ela está com o estado de solto</returns>
        public static bool Release(Keys Key)
        {
            return (State[(int)Key] & KEY_RELEASE) != 0;
        }

    }

}